<?php
declare (strict_types = 1);

namespace app\admin\controller;

use app\common\controller\Backend;
use think\response\View;
use hg\apidoc\annotation as Apidoc;
use think\facade\Db;

/**
 * 用户管理
 * @Apidoc\Group("base")
 * @package app\admin\controller
 */
class User extends Backend
{
    /**
     * 初始化参数
     * @author 贾二小
     * @since 2021/7/3
     */
    public function initialize()
    {
        $this->config = [
            'name'=>'用户管理',
            'table_name'=>'user',//表名
            'user_role_table_name'=>'user_role',//用户角色关系表
            'user_data_table_name'=>'user_data_scope',//用户角色关系表
            'emp_table_name'=>'emp',//员工
            'emp_pos_table_name'=>'emp_pos',//员工
            'emp_ext_table_name'=>'emp_ext_org_pos',//员工
            'org_table_name'=>'org',//表名
            'pos_table_name'=>'pos',//表名
            'table_alias' => 'a',//别名
            'table_field'=>'*',//显示默认字段
            'form_field' => 'id,account,name,sex,phone,email,status,birthday',//表单字段，没有设置则默认为显示字段默认是不能有*和.)
            'form_validated1' => [
                'account' => ['msg' => '账号为空', 'regex' => false, 'pcre' => '',],
                'name' => ['msg' => '姓名为空', 'regex' => false, 'pcre' => '',],
            ],//表单验证
            'form_validated2' => ['name', 'code'],//重复验证
            'search_table'=> null,//关联表时，需要重写
            'is_limit'=> true,//是否分页显示
            'search_field' => 'a.id,b.org_name,a.account,a.name,a.sex,a.phone,a.email,a.status,a.create_user_id,a.create_date,a.update_user_id,a.update_user_date',//查询表格字段
            'search_param'=>[
                ['field' => 'name', 'type' => '=', 'param'=> 'name'],
                ['field' => 'code', 'type' => '=', 'param'=> 'code'],
            ],//查询表格条件
            'is_delete'=> true,//是否假删除
            'id_validated' => [
                'id' => ['msg' => 'ID不能为空', 'db'=>true, 'db_msg'=>'当前用户不存在'],
            ],//表单验证
            'change_status'=>[
                'param'=>['id','status'],
                'error_msg'=>'更新0条数据',
            ]
        ];
        parent::initialize();
    }

    /**
     * 列表数据
     * @author 贾二小
     * @since 2021/7/14
     */
    public function page()
    {
        // 根据父机构id查询
        $pid = intval(input('pid'));
        if(!empty($pid)){
            $pids = input('pids');
            $org_ids = Db::name($this->config['org_table_name'])
                ->alias('a')
                ->where('a.id','=',$pid)
                ->whereOr('a.pids','like',$pids.',['.$pid.']%')
                ->column('a.id');
            $this->config['search_table'] = Db::name($this->config['table_name'])
                ->alias($this->config['table_alias'])
                ->join($this->config['emp_table_name'].' b','a.id=b.id')
                ->where('b.org_id','in',$org_ids);
        }else{
            $this->config['search_table'] = Db::name($this->config['table_name'])
                ->alias($this->config['table_alias'])
                ->join($this->config['emp_table_name'].' b','a.id=b.id');
        }
        parent::page(); // TODO: Change the autogenerated stub
    }

    /**
     * 用户保存
     * @author 贾二小
     * @since 2021/7/11
     */
    public function save(){
        //清空用户缓存
        cache('user_data',null);
        //获取配置参数
        $config = $this->config;
        //获取参数 id,account,name,sex,phone,email,status,birthday
        $id = intval(input('id'));
        $data = $this->request->post(explode(",", $config['form_field']));
        $sys_emp_param = input('sys_emp_param/a');
        $password = input('$password','');
        //数据验证 account,name
        $this->form_validated('form_validated1');
        if(empty($sys_emp_param['org_id']) || empty($sys_emp_param['org_name'])){
            $this->error('请选择组织架构');
        }
        //数据重复验证
        if(!empty($config['form_validated2'])){
            $map = [];
            $map[] = ['account','=',$data['account']];
            $map[] = ['is_delete','=',0];
            if(isset($data['id']) && intval($data['id']) > 0){
                $map[] = ['id','<>',$data['id']];
            }
            $count = Db::name($config['table_name'])->where($map)->count();
            if ($count > 0) {
                $this->error('数据重复');
            }
        }
        //数据组装
        $data['create_user_id'] = _current_user('id');
        $data['update_user_id'] = _current_user('id');
        $emp_data = [];
        $emp_data['org_id'] = $sys_emp_param['org_id'];
        $emp_data['org_name'] = $sys_emp_param['org_name'];
        $emp_data['job_num'] = $sys_emp_param['job_num'];
        if(!isset($data['id']) || empty($data['id'])){
            $data['admin_type'] = 1;//管理员类型（0超级管理员 1非管理员）
            $data['status'] = 0;//状态（字典 0正常 1冻结 2删除）
            $data['password'] = $password;
        }
        $pos_data = array_map(
            function ($item) use ($id) {
                return ['emp_id'=>$id,'pos_id'=>$item];
            }, $sys_emp_param['pos_ids']
        );
        $emp_ext_data = array_map(
            function ($item) use ($id) {
                return ['emp_id'=>$id,'org_id'=>$item['org_id'],'pos_id'=>$item['pos_id']];
            }, $sys_emp_param['ext_ids']
        );

        //更新数据库
        Db::transaction(function () use ($id, $data, $emp_data, $pos_data, $emp_ext_data) {
            if(isset($data['id']) && $data['id'] > 0){
                //更新表
                Db::name($this->config['table_name'])->where(['id'=>$id])->update($data);
                Db::name($this->config['emp_table_name'])->where(['id'=>$id])->update($emp_data);
                Db::name($this->config['emp_pos_table_name'])->where(['emp_id'=>$id])->delete();
                Db::name($this->config['emp_pos_table_name'])->insertAll($pos_data);
                Db::name($this->config['emp_ext_table_name'])->where(['emp_id'=>$id])->delete();
                Db::name($this->config['emp_ext_table_name'])->insertAll($emp_ext_data);
            }else{
                $id = Db::name($this->config['table_name'])->insertGetId($data);
                $emp_data['id'] = $id;
                Db::name($this->config['emp_table_name'])->insert($emp_data);
                $pos_data = array_map(
                    function ($item) use ($id) {
                        return ['emp_id'=>$id,'pos_id'=>$item['pos_id']];
                    }, $pos_data
                );
                $emp_ext_data = array_map(
                    function ($item) use ($id) {
                        return ['emp_id'=>$id,'org_id'=>$item['org_id'],'pos_id'=>$item['pos_id']];
                    }, $emp_ext_data
                );
                Db::name($this->config['emp_pos_table_name'])->insertAll($pos_data);
                Db::name($this->config['emp_ext_table_name'])->insertAll($emp_ext_data);
            }
        });
        //日志
        if(!isset($data['id']) || empty($data['id'])){
            $this->sLog($this->config['name'].'_新增',"成功");
        }else{
            $this->sLog($this->config['name'].'_编辑',"成功");
        }
        //返回
        $this->success();
    }

    /**
     * @Apidoc\Title("用户明细")
     * @Apidoc\Desc("当前用户明细")
     * @Apidoc\Url("/admin/user/detail")
     * @Apidoc\Method("GET")
     * @Apidoc\Tag("测试 基础")
     * @Apidoc\Param("id", type="int",default="0",desc="用户ID" )
     * @author 贾二小
     * @since 2021/7/14
     */
    public function detail(){
        //获取参数
        $id = intval(input('id'));
        //数据验证
        $this->form_validated('id_validated');
        //数据组装
        $data = Db::name($this->config['table_name'])->where(['id'=>$id])->find();
        $positions = Db::name($this->config['emp_pos_table_name'])->where(['emp_id'=>$id])->select();
        $ext_org_pos = Db::name($this->config['emp_ext_table_name'])
            ->alias('a')
            ->join($this->config['org_table_name'].' b','a.org_id=b.id','left')
            ->join($this->config['pos_table_name'].' c','a.pos_id=c.id','left')
            ->where(['a.emp_id'=>$id])
            ->field('a.id,a.org_id,a.pos_id,b.name as org_name,c.name as pos_name')
            ->select();
        $data['sys_emp_info'] = Db::name($this->config['emp_table_name'])->where(['id'=>$id])->find();
        $data['sys_emp_info']['ext_org_pos'] = $ext_org_pos;
        $data['sys_emp_info']['positions'] = $positions;
        //返回
        $this->success($data);
    }

    /**
     * 附属信息添加
     * @author 贾二小
     * @since 2021/7/14
     */
    public function ext_form(): View
    {
        return view();
    }

    /**
     * @Apidoc\Title("用户状态修改")
     * @Apidoc\Desc("当前用户状态修改")
     * @Apidoc\Url("/admin/user/post_grant_data")
     * @Apidoc\Method("POST")
     * @Apidoc\Tag("测试 基础")
     * @Apidoc\Param("id", type="int",default="0",desc="用户ID" )
     * @Apidoc\Param("status", type="int",default="0",desc="状态ID" )
     * @author 贾二小
     * @since 2021/7/11
     */
    public function change_status(){
        //请求数据
        $id = intval(input('id'));
        $status = intval(input('status'));
        //数据验证
        $this->form_validated('id_validated');
        if(!in_array($status,[0,1])){
            $this->error('请选择正确的状态');
        }
        //数据组装
        $data = [];
        $data['status'] = $status;
        $data['update_user_id'] = _current_user('id');
        //更新数据库
        Db::name($this->config['table_name'])->where(['id'=>$id])->update($data);
        //返回
        $this->success();
    }

    /**
     * 授权数据
     * @author 贾二小
     * @since 2021/7/14
     */
    public function grant_data(): View
    {
        return view();
    }

    /**
     * @Apidoc\Title("用户授权数据ID保存")
     * @Apidoc\Desc("当前用户授权数据(机构管理)ID保存")
     * @Apidoc\Url("/admin/user/post_grant_data")
     * @Apidoc\Method("POST")
     * @Apidoc\Tag("测试 基础")
     * @Apidoc\Param("id", type="int",default="0",desc="用户ID" )
     * @Apidoc\Param("org_ids", type="array",childrenType="int", desc="机构ID")
     * @author 贾二小
     * @since 2021/7/11
     */
    public function post_grant_data(){
        //获取参数
        $id = intval(input('id'));
        $org_ids = input('org_ids');
        //数据验证
        $this->form_validated('id_validated');
        if(count($org_ids) === 0){
            $this->error('请选择授权的数据');
        }
        //数据组装
        $data = array_map(
            function ($item) use ($id) {
                return ['user_id'=>$id,'org_id'=>$item];
            }, $org_ids
        );
        //数据库操作
        Db::transaction(function () use ($id, $org_ids, $data) {
            //删除所有默认
            Db::name($this->config['user_data_table_name'])->where(['user_id'=>$id])->delete();
            //插入当前数据
            Db::name($this->config['user_data_table_name'])->insertAll($data);
        });
        //返回
        $this->success();
    }

    /**
     * @Apidoc\Title("用户授权角色ID")
     * @Apidoc\Desc("获取当前用户已授权的角色ID")
     * @Apidoc\Url("/admin/user/own_role")
     * @Apidoc\Method("GET")
     * @Apidoc\Tag("测试 基础")
     * @Apidoc\Param("id", type="int",default="0",desc="用户ID" )
     * @author 贾二小
     * @since 2021/7/11
     */
    public function own_role(){
        //获取参数
        $id = intval(input('id'));
        //数据验证
        $this->form_validated('id_validated');
        //数据查询
        $data = Db::name($this->config['user_role_table_name'])->where(['user_id'=>$id])->column('role_id');
        //返回
        $this->success($data);
    }

    /**
     * 授权角色
     * @author 贾二小
     * @since 2021/7/14
     */
    public function grant_role(): View
    {
        return view();
    }

    /**
     * @Apidoc\Title("用户授权角色ID保存")
     * @Apidoc\Desc("当前用户授权角色ID保存")
     * @Apidoc\Url("/admin/user/post_grant_role")
     * @Apidoc\Method("POST")
     * @Apidoc\Tag("测试 基础")
     * @Apidoc\Param("id", type="int",default="0",desc="用户ID" )
     * @Apidoc\Param("role_ids", type="array",childrenType="int", desc="角色ID")
     * @author 贾二小
     * @since 2021/7/11
     */
    public function post_grant_role(){
        //获取参数
        $id = intval(input('id'));
        $role_ids = input('role_ids');
        //数据验证
        $this->form_validated('id_validated');
        if(count($role_ids) === 0){
            $this->error('请选择授权的菜单');
        }
        //数据组装
        $data = array_map(
            function ($item) use ($id) {
                return ['user_id'=>$id,'role_id'=>$item];
            }, $role_ids
        );
        //数据库操作
        Db::transaction(function () use ($id, $data) {
            //删除所有默认
            Db::name($this->config['user_role_table_name'])->where(['user_id'=>$id])->delete();
            //插入当前数据
            Db::name($this->config['user_role_table_name'])->insertAll($data);
        });
        //返回
        $this->success();
    }

    /**
     * @Apidoc\Title("用户授权数据ID")
     * @Apidoc\Desc("设置默认显示的应用")
     * @Apidoc\Url("/admin/user/own_data")
     * @Apidoc\Method("GET")
     * @Apidoc\Tag("测试 基础")
     * @Apidoc\Param("id", type="int",default="0",desc="用户ID" )
     * @author 贾二小
     * @since 2021/7/11
     */
    public function own_data(){
        //获取参数
        $id = intval(input('id'));
        //数据验证
        $this->form_validated('id_validated');
        //数据查询
        $data = Db::name($this->config['user_data_table_name'])->where(['user_id'=>$id])->column('org_id');
        //返回
        $this->success($data);
    }

    /**
     * 选择用户页面
     * @author 贾二小
     * @since 2021/7/15
     */
    public function selector(): View
    {
        return view();
    }

    /**
     * @Apidoc\Title("所有用户")
     * @Apidoc\Desc("获取所有未删除的用户")
     * @Apidoc\Url("/admin/user/get_all_user")
     * @Apidoc\Method("GET")
     * @Apidoc\Tag("测试 基础")
     * @author 贾二小
     * @since 2021/7/16
     */
    public function get_all_user(){
        $data = Db::name($this->config['table_name'])
            ->field('id,name')
            ->where(['is_delete'=>0])
            ->select();
        $this->success($data);
    }
}